package br.com.redesocial.dao;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Bruno
 */


import br.com.redesocial.entity.Usuario;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import static org.apache.taglibs.standard.functions.Functions.join;

public class Dao {
    private String servidor;
    private String banco;
    private String usuario;
    private String senha;
    private PreparedStatement stmt;
    private Connection conn;
    public HttpServletResponse response;
    public HttpSession session;
    
    public Dao(){
        this.servidor = "localhost";
        this.banco = "lonelypeople";
        this.usuario = "root";
        this.senha = "";
     }
    
    public void conectar(){
        String url = "jdbc:mysql://"+this.servidor+"/"+this.banco;
        try {
            Class.forName("org.gjt.mm.mysql.Driver");
            this.conn = DriverManager.getConnection(url, this.usuario, this.senha);
        } catch (ClassNotFoundException | SQLException ex) {
            Logger.getLogger(Dao.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Não Conectou.");
        }   
    }
    
    public int CadastrarUsuario(Usuario usu) throws IOException{
        this.conectar();        
        try{
           String verifica = "SELECT * FROM usuarios WHERE EM_Usuario='"+usu.email+"'";
           this.stmt = this.conn.prepareStatement(verifica);
           boolean execute = this.stmt.execute();
           ResultSet v_resultset = this.stmt.getResultSet();
           if(!v_resultset.last()){
                String comando = "INSERT INTO usuarios (TP_Sexo_User, TP_Sexo_Procu, DT_Nascimento, NM_Apelido, EM_Usuario, PW_Usuario, NM_Completo, UF_Estado, NM_Cidade, ST_Civil, TP_Intensao, NR_Altura, NR_Peso, PR_Civil, PR_Altura, PR_Peso, PR_Idade, PR_Distancia, NM_Avatar) VALUES (?, ?, ?, ?, ?, ?, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)";
                try{
                  this.stmt = this.conn.prepareStatement(comando, Statement.RETURN_GENERATED_KEYS);
                  stmt.setString(1, usu.sexo_user);
                  stmt.setString(2, usu.sexo_proc);
                  stmt.setString(3, usu.nasci_ano+"-"+usu.nasci_mes+"-"+usu.nasci_dia);
                  stmt.setString(4, usu.apelido);
                  stmt.setString(5, usu.email);
                  stmt.setString(6, usu.senha);
                  stmt.executeUpdate();
                  
                  String comando_usuario_ultimo = "SELECT ID_Usuario FROM usuarios ORDER BY ID_Usuario DESC LIMIT 1";
                  ResultSet resultset = stmt.executeQuery(comando_usuario_ultimo);
                  resultset.last();
                  int id_retorno = resultset.getInt("ID_Usuario");
                  return id_retorno;
              } catch (SQLException ex){
                  return 0;
              }
           } else {
               return 0;
           }      
        } catch (SQLException ex){
          return 0;
      }
    }
    
    public void CompletaCadastroUsuario(Usuario usu) throws IOException {
        this.conectar();
        String intencao = join(usu.intencao, ",");
        String p_est_civil = join(usu.p_est_civil, ",");        
        try{
            String comando_completa = "UPDATE usuarios SET NM_Completo='"+usu.nm_completo+"', UF_Estado='"+usu.estado+"', NM_Cidade='"+usu.cidade+"', ST_Civil="+usu.u_est_civil+", TP_Intensao='"+intencao+"', NR_Altura='"+usu.u_altura+"', NR_Peso='"+usu.u_peso+"', PR_Civil='"+p_est_civil+"', PR_Altura='"+usu.p_altura_min+"-"+usu.p_altura_max+"', PR_Peso='"+usu.p_peso_min+"-"+usu.p_peso_max+"', PR_Idade='"+usu.p_idade_min+"-"+usu.p_idade_max+"', PR_Distancia="+usu.distancia+" WHERE ID_Usuario="+usu.id_usuario;
            this.stmt = this.conn.prepareStatement(comando_completa, Statement.RETURN_GENERATED_KEYS);
            stmt.executeUpdate();
        } catch (SQLException ex){ } 
    }

    public List AutenticarUsuario(Usuario usu) throws IOException {
        this.conectar();
        String comando; 
        List retorno = new ArrayList();
        comando = "SELECT * FROM usuarios WHERE  EM_Usuario='"+usu.autentica_email+"' AND PW_Usuario='"+usu.autentica_senha+"'";
        try{
            this.stmt = this.conn.prepareStatement(comando);          
            boolean execute = stmt.execute();          
            ResultSet resultSet = stmt.getResultSet();
            resultSet.last();
               
             
            if(resultSet.getRow()>0) {
                retorno.add(0,resultSet.getString("NM_Apelido"));
                retorno.add(1,resultSet.getString("EM_Usuario"));
                retorno.add(2,resultSet.getString("DT_Nascimento"));
                retorno.add(3,resultSet.getString("TP_Sexo_User"));
                retorno.add(4,resultSet.getString("TP_Sexo_Procu"));                
                retorno.add(5,resultSet.getString("NM_Avatar"));
                retorno.add(6,resultSet.getString("NM_Completo"));
                retorno.add(7,resultSet.getString("UF_Estado"));
                retorno.add(8,resultSet.getString("NM_Cidade"));
                retorno.add(9,resultSet.getString("ST_Civil"));
                retorno.add(10,resultSet.getString("TP_Intensao"));
                retorno.add(11,resultSet.getString("NR_Altura"));
                retorno.add(12,resultSet.getString("NR_Peso"));
                retorno.add(13,resultSet.getString("PR_Civil"));
                retorno.add(14,resultSet.getString("PR_Altura"));
                retorno.add(15,resultSet.getString("PR_Peso"));
                retorno.add(16,resultSet.getString("PR_Idade"));
                retorno.add(17,resultSet.getString("PR_Distancia"));            
                retorno.add(18,resultSet.getString("ID_Usuario"));
                return retorno;
            } else {
                retorno.add(0,"erro");
                return retorno;
            }
         } catch (SQLException ex){
             retorno.add(0, "Erro: "+ex.getMessage());
          return retorno;
      }
    }
    
    public void AdicionaFeed(String conteudo,HttpServletRequest request) throws SQLException{
        this.conectar();        
        HttpSession session = request.getSession();
        String comando = "INSERT INTO feeds (id_feed, cd_autor, conteudo, data) VALUES (NULL, ?, ?, NOW())";
        try{
           this.stmt = this.conn.prepareStatement(comando);
        stmt.setString(1, (String) session.getAttribute("ID_Usuario"));
        stmt.setString(2, conteudo);
        stmt.executeUpdate();
        } catch (SQLException ex){}       
    }
    
    public String ListaFeeds(HttpServletRequest request) throws SQLException{
        this.conectar();
        HttpSession session = request.getSession();
        String retorno = "";
        String comando = "SELECT f.*, u.NM_Apelido, u.NM_Avatar FROM feeds AS f " +
                         "LEFT JOIN usuarios AS u " +
                         "ON f.cd_autor=u.ID_Usuario " +
                         "ORDER BY f.data DESC LIMIT 5";
        this.stmt = this.conn.prepareStatement(comando);          
        boolean execute = stmt.execute();          
        ResultSet rs = stmt.getResultSet();
        while(rs.next()){
            String NM_Avatar = (rs.getString("NM_Avatar")==null)?"images/sem_perfil.jpeg":rs.getString("NM_Avatar");            
            
            retorno += "<li>";
            retorno += "<div id=\"autor\">";
            retorno += "<img src=\""+NM_Avatar+"\" width=\"60\" height=\"60\" />";
            retorno += "<span>"+rs.getString("NM_Apelido")+"</span>";
            retorno += "</div>";
            retorno += "<div id=\"conteudo\">";
            retorno += rs.getString("conteudo");
            retorno += "</div>";
            retorno += "</li>";            
        }
        return retorno;
    }
    
    public String ListaAmigos(HttpServletRequest request) throws SQLException{
        this.conectar();
        HttpSession session = request.getSession();
        String retorno = "";
        String id_usuario = (String) session.getAttribute("ID_Usuario");
        
        String comando = "SELECT a.*, u.NM_Apelido, u.NM_Avatar FROM amigos AS a " +
                         "LEFT JOIN usuarios AS u " +
                         "ON a.cd_amigo=u.ID_Usuario " +
                         "WHERE a.id_usuario="+id_usuario+" "+
                         "ORDER BY situacao ASC LIMIT 5";
        this.stmt = this.conn.prepareStatement(comando);          
        boolean execute = stmt.execute();          
        ResultSet rs = stmt.getResultSet();
        int c=0;
        while(rs.next()){
            String NM_Avatar = (rs.getString("NM_Avatar")==null)?"images/sem_perfil.jpeg":rs.getString("NM_Avatar");            
            
            retorno += "<li>";
            retorno += "<img src=\""+NM_Avatar+"\" width=\"60\" height=\"60\" />";
            retorno += "<a href=\"/LonelyPeople/LonelyPeople/?q=perfil&id="+rs.getString("cd_amigo")+"\"><strong>"+rs.getString("NM_Apelido")+"</strong></a>";
            if(rs.getString("situacao").equals("0")){
                retorno += "<input type=\"button\" value=\"Aceitar\" id=\""+rs.getString("cd_amigo")+"\" class=\"aceitar\" onclick=\"AceitarAmigo(this);\" />";
            } else {
                retorno += "<input type=\"button\" value=\"Conversar\" id=\""+rs.getString("cd_amigo")+"\"/>";
            }            
            retorno += "</li>";    
            c++;
        }
        retorno += "<li class=\"acao\">";
        if(c>5){
            retorno += "<a href=\"#\" title=\"Veja todos seus amigos\"><img src=\"images/lista.jpg\" width=\"30\" height=\"30\" border=\"0\" /></a>";
        }        
        retorno += "</li>";
        return retorno;
    }
    
    public void AceitarAmigos(String id_amigo, HttpServletRequest request) throws SQLException{
        this.conectar();
        HttpSession session = request.getSession();
        String id_usuario = (String) session.getAttribute("ID_Usuario");
        
        String comando_atualiza = "UPDATE amigos SET situacao=1 WHERE id_usuario="+id_usuario+" AND cd_amigo="+id_amigo;
        this.stmt = this.conn.prepareStatement(comando_atualiza, Statement.RETURN_GENERATED_KEYS);
        stmt.executeUpdate();
        
        String comando_amigo = "INSERT INTO amigos (id_usuario, cd_amigo, situacao) VALUES (?,?,1)";
        this.stmt = this.conn.prepareStatement(comando_amigo, Statement.RETURN_GENERATED_KEYS);
        stmt.setString(1, id_amigo);
        stmt.setString(2, id_usuario);
        stmt.executeUpdate();
    }
    
    public String BuscaAmigo(String amigo, HttpServletRequest request) throws SQLException{
        this.conectar();
        HttpSession session = request.getSession();
        String retorno = "";
        String id_usuario = (String) session.getAttribute("ID_Usuario");
        
        String comando = "SELECT a.situacao, u.* FROM usuarios AS u " +
                          "LEFT JOIN amigos AS a " +
                          "ON u.ID_Usuario=a.cd_amigo " +
                          "WHERE u.ID_Usuario NOT IN("+id_usuario+") AND " +
                          "(NM_Completo LIKE '%"+amigo+"%' OR NM_Apelido LIKE '%"+amigo+"%') " +
                          "ORDER BY u.NM_Completo ASC";
        this.stmt = this.conn.prepareStatement(comando);          
        boolean execute = stmt.execute();          
        ResultSet rs = stmt.getResultSet();
        while(rs.next()){
            String NM_Avatar = (rs.getString("NM_Avatar")==null)?"images/sem_perfil.jpeg":rs.getString("NM_Avatar");            
            
            String civil = "";
            switch(rs.getInt("ST_Civil")){
                case 1:
                    civil = "Solteiro(a)";
                break;
                    
                case 2:
                    civil = "Divorciado(a)";
                break;
                    
                case 3:
                    civil = "Viuvo(a)";
                break;
                    
                case 4:
                    civil = "Casado(a)";
                break;
            }
            
            retorno += "<li>";
            retorno += "<img src=\""+NM_Avatar+"\" width=\"60\" height=\"60\" />";
            retorno += "<div id=\"dados\">";
            retorno += "<div id=\"nome\"><strong>"+rs.getString("NM_Completo")+"</strong> ("+rs.getString("NM_Apelido")+")</div>";
                        
            
            if(rs.getString("ST_Civil")!=null){
                retorno += "<span id=\"civil\">"+civil+"</span>";
            }
            
            retorno += "<span id=\"local\">"+rs.getString("NM_Cidade")+" / "+rs.getString("UF_Estado")+"</span>";
            retorno += "</div>";
            
            String situacao = rs.getString("situacao");
            
            if(situacao==null){
                retorno += "<input type=\"button\" value=\"Solicitar amizade\" id=\""+rs.getString("ID_Usuario")+"\" onclick=\"SolicitarAmizade(this)\" />";
            } else
            if(situacao.equals("0")){
                retorno += "<input type=\"button\" value=\"Aceitar\" class=\"aceitar\" />";
            } else 
            if(situacao.equals("1")){
                retorno += "<input type=\"button\" value=\"Conversar\" class=\"conversar\" />";
            }
        }
        
        if(retorno.equals("")){
            retorno = "<li><center><h3>Nenhum resultado encontrado</h3></li>";
        }
        
        return retorno;
    }    
    
    public void SolicitarAmizade(String id_amigo, HttpServletRequest request) throws SQLException{
        this.conectar();
        HttpSession session = request.getSession();
        String id_usuario = (String) session.getAttribute("ID_Usuario");
        
        String comando_amigo = "INSERT INTO amigos (id_usuario, cd_amigo, situacao) VALUES (?,?,0)";
        this.stmt = this.conn.prepareStatement(comando_amigo, Statement.RETURN_GENERATED_KEYS);
        stmt.setString(1, id_amigo);
        stmt.setString(2, id_usuario);
        stmt.executeUpdate();
    }
    
    public List Perfil(String perfil) throws SQLException{
        this.conectar();
        List retorno = new ArrayList();
        String comando = "SELECT * FROM usuarios WHERE ID_Usuario="+perfil;
        this.stmt = this.conn.prepareStatement(comando, Statement.RETURN_GENERATED_KEYS);
        boolean execute = stmt.execute();
        ResultSet rs = stmt.getResultSet();
        rs.last();
        
        
        retorno.add(0,rs.getString("NM_Apelido"));
        retorno.add(1,rs.getString("EM_Usuario"));
        retorno.add(2,rs.getString("DT_Nascimento"));
        retorno.add(3,rs.getString("TP_Sexo_User"));
        retorno.add(4,rs.getString("TP_Sexo_Procu"));                
        retorno.add(5,rs.getString("NM_Avatar"));
        retorno.add(6,rs.getString("NM_Completo"));
        retorno.add(7,rs.getString("UF_Estado"));
        retorno.add(8,rs.getString("NM_Cidade"));
        retorno.add(9,rs.getString("ST_Civil"));
        retorno.add(10,rs.getString("TP_Intensao"));
        retorno.add(11,rs.getString("NR_Altura"));
        retorno.add(12,rs.getString("NR_Peso"));
        retorno.add(13,rs.getString("PR_Civil"));
        retorno.add(14,rs.getString("PR_Altura"));
        retorno.add(15,rs.getString("PR_Peso"));
        retorno.add(16,rs.getString("PR_Idade"));
        retorno.add(17,rs.getString("PR_Distancia"));            
        retorno.add(18,rs.getString("ID_Usuario"));
        
        return retorno;
    }
}